#!/usr/bin/env python

import getopt,sys
import subprocess
from random import random,randint,seed
from math import sqrt

def runtest(li,args):
	# abro ./domino con parametros args
	fp=subprocess.Popen(['./domino']+args, shell=False, stdin=subprocess.PIPE,stdout=subprocess.PIPE)
	for caso,p in li:
		fp.stdin.write(str(len(caso))+"\n") # le mando el tamanio
		for line in caso:
			fp.stdin.write(line+"\n") # le mando la linea de la matriz
		r=fp.stdout.readline().rstrip() # recibo el resultado
		print "n=",len(caso)," p=",p," ",args[0],"=",r
		yield len(caso),p,r # lo devuelvo
	fp.stdin.write("-1\n") # le mando un -1 para que termine


def int2matrix(n,l):
	res=''
	while n>1:
		res=(n%2 and '#' or '_') + res
		n/=2
	res=(n and '#' or '_') + res
	return [('_'*(l**2-len(res)) + res)[i:i+l] for i in range(0,l**2,l)]

def randMatrix(n,p): #una matriz al azar con probabilidad p de que cada casilla sea sana
	res=[]
	for i in range(n):
		res.append('')
		for j in range(n):
			res[i]=(random()<p and '#' or '_') + res[i]
	return res


def usage():
	print "Usage:"
	print "-t (o --time) para calcular tiempos"
	print "-c (o --count) para contar operaciones"
	sys.exit(2)

try:
	opts, args = getopt.getopt(sys.argv[1:], "tc", ["time", "count"])
except getopt.GetoptError, err:
	# print help information and exit:
	print str(err) # will print something like "option -a not recognized"
	usage()
if not opts: usage()
opts=map(lambda x: x[0],opts)

seed(123) # defino el seed para hacer el experimento reproducible

# genero la lista de los casos de prueba
ms=[(randMatrix(n,p/20.),p/20.) for n in range(1,9) for p in range(1,20,1) for re in range(15)]

out=""
if "--time" in opts or "-t" in opts:
	for i in runtest(ms,['time','0.003','3']): # para cada caso de prueba...
		vals=map(float,i[2].split()) # obtengo la lista de los tiempos
		val=reduce(lambda x,y:x+y,vals)/len(vals) # tomo el promedio
		err=max([abs(x-val) for x in vals]) # calculo el error
		dat = (str(i[0])+"\t"+ "%.1f"%i[1] +"\t"+ "%.8f"%val +"\t"+ "%.8f"%err +"\n") # lo preparo para el archivo de salida
		out += dat
	open('time_err.dat','w').write("# N\tP\tTIEMPO\tERROR\n"+out) # lo guardo en el archivo
	print "\nOutput escrito a time_err.dat"

out=""
if "--count" in opts or "-c" in opts:
	for i in runtest(ms,['count']): #para cada caso de prueba..
		dat = str(i[0])+"\t"+("%.1f"%i[1])+"\t"+i[2]+"\n" # lo formateo para la salida
		out += dat
	open('counts.dat','w').write("# N\tP\tCOUNT\n"+out) # lo guardo en el archivo
	print "\nOutput escrito a counts.dat"

out=""
for caso,p in ms:
	out+=str(len(caso))+"\n"
	for line in caso:
		out+=line+"\n"
open('test.in','w').write(out+"-1\n")
